﻿Imports Commander_Wars.Spieletools
<Serializable()> Public Class ObjektRegeln
    Implements ICloneable
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="neuKriegsnebel"></param>
    ''' <param name="AnzahlderSpieler"></param>
    ''' <param name="neuSiegbedingungen"></param>
    ''' <param name="Zufallswetter"></param>
    ''' <param name="neueWetterwahrscheinlichkeit"></param>
    ''' <param name="StartWetter">Das Wetter zu Begiinn ist Gleichzeitig das Standardwetter</param>
    ''' <param name="neuSpieldauer"></param>
    ''' <param name="Besetzungen"></param>
    ''' <param name="Unbesiegbare"></param>
    ''' <param name="neuMissionsgewinner"></param>
    ''' <param name="neuMissionssiege"></param>
    ''' <param name="Luftschlacht"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal neuKriegsnebel As Boolean, ByVal AnzahlderSpieler As Integer, ByVal neuSiegbedingungen() As Siegbedingungen, ByVal Zufallswetter As Boolean, ByVal neueWetterwahrscheinlichkeit() As Integer, Optional ByVal StartWetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne, Optional ByVal neuSpieldauer As Integer = -1, Optional ByVal Besetzungen As Integer = -1, Optional ByVal Unbesiegbare() As Integer = Nothing, Optional ByVal neuMissionsgewinner() As Integer = Nothing, Optional ByVal neuMissionssiege() As String = Nothing, Optional ByVal Luftschlacht As Boolean = True)
        If neuKriegsnebel = False Then
            Nebel = Nebelarten.Aus
        Else
            Nebel = Nebelarten.Kriegsnebel
        End If
        StandartSiegbedingungen = neuSiegbedingungen
        Unbesiegbar = Unbesiegbare
        Missionsgewinner = neuMissionsgewinner
        Missionssiege = neuMissionssiege
        Wetterwahrscheinlichkeiten = neueWetterwahrscheinlichkeit
        Wetter = StartWetter
        Me.Luftschlacht = Luftschlacht
        Me.Standardwetter = StartWetter
        If Zufallswetter = False Then
            Me.Zufallswetter = Zufallswetter
        Else
            If Wetter = ObjektSpielfeld.Wetterarten.Sonne Then
                AnzahlderRundenBiszurnächstenWetterÄnderung = Zufallszahl(1, AnzahlderSpieler * 2)
            Else
                AnzahlderRundenBiszurnächstenWetterÄnderung = AnzahlderSpieler
            End If
        End If

        'Wir sind in einem Netzwerkspiel, also müssen wir entweder das wetter als Host senden, oder als Client empfangen.
        If (Hauptmenü.NetzHosten And Hauptmenü.NetzConnected) Or (Not Hauptmenü.NetzConnected) Then
            If Objektverwalter.Spielfeld IsNot Nothing Then
                Hauptmenü.NetzBefehlSenden(Wetter)
            End If
        End If

        If neuSpieldauer > 0 Then
            MaximaleSpieldauer = neuSpieldauer
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Zeit
        End If
        If Besetzungen > 0 Then
            AnzahlderBesetzungen = Besetzungen
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Besetzungen
        End If
        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                MenschenZählen()
            End If
        End If
    End Sub
    Public Sub New(ByVal AnzahlderSpieler As Integer, ByVal CountHuman As Boolean)
        Nebel = Nebelarten.Aus
        StandartSiegbedingungen = New ObjektRegeln.Siegbedingungen() {ObjektRegeln.Siegbedingungen.KeineHQs, ObjektRegeln.Siegbedingungen.KeineEinheiten}
        Unbesiegbar = Nothing
        Missionsgewinner = Nothing
        Missionssiege = New String() {}
        Wetterwahrscheinlichkeiten = New Integer() {70, 10, 10, 10}
        Wetter = ObjektSpielfeld.Wetterarten.Sonne
        Me.Luftschlacht = True
        Me.Standardwetter = ObjektSpielfeld.Wetterarten.Sonne
        If Zufallswetter = False Then
            Me.Zufallswetter = Zufallswetter
        Else
            If Wetter = ObjektSpielfeld.Wetterarten.Sonne Then
                AnzahlderRundenBiszurnächstenWetterÄnderung = Zufallszahl(1, AnzahlderSpieler * 2)
            Else
                AnzahlderRundenBiszurnächstenWetterÄnderung = AnzahlderSpieler
            End If
        End If

        'Wir sind in einem Netzwerkspiel, also müssen wir entweder das wetter als Host senden, oder als Client empfangen.
        If (Hauptmenü.NetzHosten And Hauptmenü.NetzConnected) Or (Not Hauptmenü.NetzConnected) Then
            Hauptmenü.NetzBefehlSenden(Wetter)
        End If

        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If CountHuman = True Then
            If IsNothing(Objektverwalter.Spielfeld) = False Then
                If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                    MenschenZählen()
                End If
            End If
        End If
    End Sub
    Public Sub New(ByVal neuKriegsnebel As Nebelarten, ByVal AnzahlderSpieler As Integer, ByVal neuSiegbedingungen() As Siegbedingungen, ByVal Zufallswetter As Boolean, ByVal neueWetterwahrscheinlichkeit() As Integer, Optional ByVal StartWetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne, Optional ByVal neuSpieldauer As Integer = -1, Optional ByVal Besetzungen As Integer = -1, Optional ByVal Unbesiegbare() As Integer = Nothing, Optional ByVal neuMissionsgewinner() As Integer = Nothing, Optional ByVal neuMissionssiege() As String = Nothing, Optional ByVal Luftschlacht As Boolean = True)
        Nebel = neuKriegsnebel
        StandartSiegbedingungen = neuSiegbedingungen
        Unbesiegbar = Unbesiegbare
        Missionsgewinner = neuMissionsgewinner
        Missionssiege = neuMissionssiege
        Wetterwahrscheinlichkeiten = neueWetterwahrscheinlichkeit
        Wetter = StartWetter
        Me.Luftschlacht = Luftschlacht
        Me.Standardwetter = StartWetter
        If Zufallswetter = False Then
            Me.Zufallswetter = Zufallswetter
        Else
            If Wetter = ObjektSpielfeld.Wetterarten.Sonne Then
                AnzahlderRundenBiszurnächstenWetterÄnderung = Zufallszahl(1, AnzahlderSpieler * 2)
            Else
                AnzahlderRundenBiszurnächstenWetterÄnderung = AnzahlderSpieler
            End If
        End If

        'Wir sind in einem Netzwerkspiel, also müssen wir entweder das wetter als Host senden, oder als Client empfangen.
        If (Hauptmenü.NetzHosten And Hauptmenü.NetzConnected) Or (Not Hauptmenü.NetzConnected) Then
            Hauptmenü.NetzBefehlSenden(Wetter)
        End If

        If neuSpieldauer > 0 Then
            MaximaleSpieldauer = neuSpieldauer
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Zeit
        End If
        If Besetzungen > 0 Then
            AnzahlderBesetzungen = Besetzungen
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Besetzungen
        End If
        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                MenschenZählen()
            End If
        End If
    End Sub
    Public Sub MenschenZählen()
        AnzahlderMenschen = 0
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch And Besiegt(I) = False Then
                AnzahlderMenschen += 1
            End If
        Next

    End Sub
    Dim Nebel2 As Nebelarten = Nebelarten.Aus
    Public Property Nebel() As Nebelarten
        Get
            Select Case My.Settings.CommanderWarsGameMoodus
                Case CommanderWarsGameModi.AdvanceWarsDS
                    If Wetter = ObjektSpielfeld.Wetterarten.Regen Then
                        Return Nebelarten.Kriegsnebel
                    Else
                        Return Nebel2
                    End If
                Case Else
                    Return Nebel2
            End Select
        End Get
        Set(ByVal value As Nebelarten)
            Nebel2 = value
        End Set
    End Property

    ''' <summary>
    ''' Wenn true können Einheitenstärker werden, wenn sie Feinde vernichten.
    ''' </summary>
    ''' <remarks></remarks>
    Public LevelModus As Boolean = True
#Region "Wetter"
    Public Wetterwahrscheinlichkeiten() As Integer = {}
    ''' <summary>
    ''' Auf das Wetter kann man gerne zugreifen, aber wenn man das Wetter setzten will, sollte man den anderen Netzwerkspielern bescheid geben.
    ''' </summary>
    ''' <remarks></remarks>
    Public Wetter As ObjektSpielfeld.Wetterarten

    Public AnzahlderRundenBiszurnächstenWetterÄnderung As Integer = 0
    Public Zufallswetter As Boolean = True
    Public Standardwetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne
    Public Sub WetterÄndern()

        If AnzahlderRundenBiszurnächstenWetterÄnderung > 0 Then
            AnzahlderRundenBiszurnächstenWetterÄnderung -= 1
            If AnzahlderRundenBiszurnächstenWetterÄnderung < 0 Then
                AnzahlderRundenBiszurnächstenWetterÄnderung = 0
            End If
        ElseIf AnzahlderRundenBiszurnächstenWetterÄnderung = 0 Then

            'Bevor wir das Wetter ändern sollten wir aufpassen (Bei einem Netzwerkspiel)

            If (Hauptmenü.NetzHosten = False And Hauptmenü.NetzConnected) Or (Hauptmenü.AufzeichnungAbspielen) Then
                Exit Sub
            End If

            'Wenn wir bis hierher überlebt haben, haben wir das recht das Wetter zu ändern.

            If Zufallswetter = True Then
                Dim Zufall As Integer = Zufallszahl(1, 100)
                For I = 0 To Wetterwahrscheinlichkeiten.Length - 1
                    If Zufall <= Wetterwahrscheinlichkeiten(I) Then
                        Wetter = I

                        'Oho wir sind also der Host in einem Netzwerkspiel, der über alle anderen Spieler entscheidet.
                        Hauptmenü.NetzBefehlSenden(Wetter)

                        Exit For
                    Else
                        Zufall -= Wetterwahrscheinlichkeiten(I)
                    End If
                Next
            Else
                Wetter = Standardwetter

                'Oho wir sind also der Host in einem Netzwerkspiel, der über alle anderen Spieler entscheidet.
                Hauptmenü.NetzBefehlSenden(Wetter)

            End If
            Dim Mitspieler As Integer = 0
            For I = 1 To Besiegt.Length - 1
                If Besiegt(I) = False Then
                    Mitspieler += 1
                End If
            Next
            If Wetter = Standardwetter Then
                AnzahlderRundenBiszurnächstenWetterÄnderung = Zufallszahl(1, Mitspieler * 2)
            Else
                AnzahlderRundenBiszurnächstenWetterÄnderung = Mitspieler - 1 'Ich bin mir nicht sicher aber, beim jetztigen Spieler ist ja schon das Wetter muss es also nicht noch -1 sein.
            End If

        End If
        Objektverwalter.Spielfeld.Sichterstellen()
    End Sub
    ''' <summary>
    ''' Das hier wird von Gaben und so aufgerufen. Kann also bei jeden Netzwerkspiel unabhängig voneinander berechnet werden. Kein Synchronisationsbedarf, soweit ich das hier überblicke.
    ''' </summary>
    ''' <param name="Wetter"></param>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub WetterÄndern(ByVal Wetter As ObjektSpielfeld.Wetterarten, ByVal Dauer As Integer)
        Me.Wetter = Wetter
        Dim Mitspieler As Integer = 0
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) = False Then
                Mitspieler += 1
            End If
        Next
        AnzahlderRundenBiszurnächstenWetterÄnderung = Mitspieler * Dauer - 1 'Ich bin mir nicht sicher aber, beim jetztigen Spieler ist ja schon das Wetter muss es also nicht noch -1 sein.
        Objektverwalter.Spielfeld.Sichterstellen()
    End Sub
    ''' <summary>
    ''' Berechnet das wahrscheinliche Wetter bei Spieler N
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetWetterBeiSpieler(ByVal Spieler As Integer) As ObjektSpielfeld.Wetterarten
        If AnzahlderRundenBiszurnächstenWetterÄnderung > 0 Then
            If Spieler > 0 Then
                Dim RundenZumSpieler As Integer = 0
                If Spieler > Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                    For I = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler + 1 To Spieler
                        If Besiegt(I) = False Then
                            RundenZumSpieler += 1
                        End If
                    Next
                Else
                    For I = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler + 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                        If Besiegt(I) = False Then
                            RundenZumSpieler += 1
                        End If
                    Next
                    For I = 1 To Spieler
                        If Besiegt(I) = False Then
                            RundenZumSpieler += 1
                        End If
                    Next
                End If
                If RundenZumSpieler < AnzahlderRundenBiszurnächstenWetterÄnderung Then
                    Return Wetter
                Else
                    Return Standardwetter
                End If
            Else
                Return Wetter
            End If
        Else 'Wir haben kein Zufallswetter
            Return Wetter
        End If
    End Function
#End Region
    Public Luftschlacht As Boolean = False
    <NonSerialized()> Public AnzahlderMenschen As Integer
    Public LetzterMensch As Integer = 0
    ''' <summary>
    ''' Für jede Einheit steigt der Einheitenpreis um diesen Wert
    ''' </summary>
    ''' <remarks></remarks>
    Public Teurungsrate As Integer = 0
    ''' <summary>
    ''' Haben wir eine Baublockade
    ''' </summary>
    ''' <remarks></remarks>
    Public BauBlockade As Boolean = False
#Region "Gewinnen"


    Public Spielende As Boolean = False
    Dim Missionsgewinner() As Integer
    Dim Unbesiegbar() As Integer
    Public Besiegbar(,) As Boolean = {}
    Public Besiegt() As Boolean = {}
    Public StandartSiegbedingungen() As Siegbedingungen = {}
    Dim MaximaleSpieldauer As Integer = -1
    Public ReadOnly Property MaxSpieldauer() As Integer
        Get
            Return MaximaleSpieldauer
        End Get
    End Property
    Dim AnzahlderBesetzungen As Integer = -1
    Public ReadOnly Property MaximaleanzahlderBesetzungen() As Integer
        Get
            Return AnzahlderBesetzungen
        End Get
    End Property
    Enum Siegbedingungen
        KeineHQs
        KeineEinheiten
        KeineBesetzungen
        Zeit
        Besetzungen
    End Enum
    Public Missionssiege() As String = {}
    Public Function CheckSieg() As Boolean
        If Objektverwalter.Spielfeld.AktuellerSpieler.SpielerBaublockade IsNot Nothing Then
            Objektverwalter.Spielfeld.AktuellerSpieler.SpielerBaublockade.UpdateValues()
        End If

        If Besiegt.Length > Objektverwalter.Spielfeld.Spieler.Length Then
            Array.Resize(Besiegt, Objektverwalter.Spielfeld.Spieler.Length)
        End If
        SindBesiegbar()


        If IsNothing(StandartSiegbedingungen) = False Then
            IstBesiegt()
        End If
        NeutralMachen()
        If CountTeams() = 1 Then
            'Ein Team hat gewonnen
            Spielende = True
        Else
            MenschenZählen()
        End If
    End Function
    ''' <summary>
    ''' Überprüft welche Spieler noch mit Spielen dürfen und löscht gegebenenfalls andere Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub IstBesiegt()
        Dim AnzahlderEinheiten() As Integer = {}
        Dim AnzahlderHQs() As Integer = {}
        Array.Resize(AnzahlderEinheiten, Besiegt.Length)
        Array.Resize(AnzahlderHQs, Besiegt.Length)
        Dim Max As Integer = 0
        If Luftschlacht = True Then
            Max = 1
        End If
        For I = 0 To Max
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        AnzahlderEinheiten(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler) += 1
                    End If
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Angriff = ObjektGebäude.Angriffe.HQ Then
                            AnzahlderHQs(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler) += 1
                        End If
                    End If
                Next
            Next
        Next
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            If Objektverwalter.Spielfeld.AktuelleEinheit.Leben > 0 Then
                AnzahlderEinheiten(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) += 1
            End If
        End If
        For I = 0 To StandartSiegbedingungen.Length - 1
            Select Case StandartSiegbedingungen(I)
                Case Siegbedingungen.Besetzungen
                    For I2 = 1 To AnzahlderEinheiten.Length - 1
                        If Objektverwalter.Spielfeld.Spieler(I2).CountBuildings >= AnzahlderBesetzungen Then
                            For I3 = 1 To AnzahlderEinheiten.Length - 1
                                If Objektverwalter.Spielfeld.Spieler(I3).Team <> Objektverwalter.Spielfeld.Spieler(I2).Team Then
                                    If IsNothing(Unbesiegbar) = False Then
                                        If Array.IndexOf(Unbesiegbar, I3) < 0 Then
                                            Besiegt(I3) = True
                                        End If
                                    Else
                                        Besiegt(I3) = True
                                    End If
                                Else
                                    Besiegt(I3) = False
                                End If
                            Next
                        End If
                    Next
                Case Siegbedingungen.KeineBesetzungen
                    For I2 = 0 To AnzahlderEinheiten.Length - 1
                        If Objektverwalter.Spielfeld.Spieler(I2).Geldgebäude <= 0 Then
                            If Besiegbar(I2, Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineBesetzungen)) = True Then
                                If IsNothing(Unbesiegbar) = False Then
                                    If Array.IndexOf(Unbesiegbar, I2) < 0 Then
                                        Besiegt(I2) = True
                                    End If
                                Else
                                    Besiegt(I2) = True
                                End If
                            End If
                        End If
                    Next
                Case Siegbedingungen.KeineEinheiten
                    For I2 = 0 To AnzahlderEinheiten.Length - 1
                        If AnzahlderEinheiten(I2) <= 0 Then
                            If Besiegbar(I2, Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineEinheiten)) = True Then
                                If IsNothing(Unbesiegbar) = False Then
                                    If Array.IndexOf(Unbesiegbar, I2) < 0 Then
                                        Besiegt(I2) = True
                                    End If
                                Else
                                    Besiegt(I2) = True
                                End If
                            End If
                        End If
                    Next
                Case Siegbedingungen.KeineHQs
                    For I2 = 0 To AnzahlderEinheiten.Length - 1
                        If AnzahlderHQs(I2) <= 0 Then
                            If Besiegbar(I2, Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineHQs)) = True Then
                                If IsNothing(Unbesiegbar) = False Then
                                    If Array.IndexOf(Unbesiegbar, I2) < 0 Then
                                        If Besiegt(I2) = False Then
                                            If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars Then
                                                Übernehmen(I2)
                                            End If
                                            Besiegt(I2) = True
                                        End If
                                    End If
                                ElseIf Besiegt(I2) = False Then
                                    If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars Then
                                        Übernehmen(I2)
                                    End If
                                    Besiegt(I2) = True
                                End If
                            End If
                        End If
                    Next
                Case Siegbedingungen.Zeit
                    If Objektverwalter.Spielfeld.Runde >= MaximaleSpieldauer Then
                        'Jetzt müssen wir ermitteln wer gewonnen
                        Dim Siegspieler As Integer = -1
                        Dim Siegbesetzungen As Integer = -1
                        For I2 = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                            Dim Bes As Integer = Objektverwalter.Spielfeld.Spieler(I2).CountBuildings
                            If Bes > Siegbesetzungen Then
                                Siegspieler = I2
                                Siegbesetzungen = Bes
                            ElseIf Bes = Siegbesetzungen And Siegbesetzungen >= 0 Then
                                Siegspieler = -1
                            End If
                        Next
                        If Siegspieler > 0 Then
                            For I3 = 1 To AnzahlderEinheiten.Length - 1
                                If Objektverwalter.Spielfeld.Spieler(I3).Team <> Objektverwalter.Spielfeld.Spieler(Siegspieler).Team Then
                                    If IsNothing(Unbesiegbar) = False Then
                                        If Array.IndexOf(Unbesiegbar, I3) < 0 Then
                                            Besiegt(I3) = True
                                        End If
                                    Else
                                        Besiegt(I3) = True
                                    End If
                                Else
                                    Besiegt(I3) = False
                                End If
                            Next
                        End If
                    End If
            End Select
        Next
    End Sub
    Public Function IstBesiegt(ByVal Spieler As Integer) As Boolean
        Return Besiegt(Spieler)
    End Function
    Public Sub SindBesiegbar()
        Dim AnzahlderEinheiten() As Integer = {}
        Dim AnzahlderGebäude() As Integer = {}
        Dim AnzahlderHQs() As Integer = {}
        Array.Resize(AnzahlderEinheiten, Besiegt.Length)
        Array.Resize(AnzahlderGebäude, Besiegt.Length)
        Array.Resize(AnzahlderHQs, Besiegt.Length)
        If Besiegbar.GetLength(0) > Besiegt.Length Then
            Dim R(Besiegt.Length - 1, Besiegbar.GetLength(1) - 1) As Boolean
            For I = 0 To Besiegt.Length - 1
                For I2 = 0 To Besiegbar.GetLength(1) - 1
                    R(I, I2) = Besiegbar(I, I2)
                Next
            Next
            Besiegbar = R
        End If
        Dim Max As Integer = 0
        If Luftschlacht = True Then
            Max = 1
        End If
        For I = 0 To Max
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        AnzahlderEinheiten(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler) += 1
                    End If
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.getFonds = True Then
                            AnzahlderGebäude(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler) += 1
                        End If
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Angriff = ObjektGebäude.Angriffe.HQ Then
                            AnzahlderHQs(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler) += 1
                        End If
                    End If
                Next
            Next
        Next
        'Nun wird der Wert festgesetzt
        For I = 1 To Besiegbar.GetLength(0) - 1
            Dim Stelle As Integer = Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineEinheiten)
            If Stelle >= 0 Then
                If Besiegbar(I, Stelle) = False Then
                    If AnzahlderEinheiten(I) > 0 Then
                        Besiegbar(I, Stelle) = True
                    End If
                End If
            End If
            Stelle = Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineHQs)
            If Stelle >= 0 Then

                If AnzahlderHQs(I) > 0 Then
                    Besiegbar(I, Stelle) = True
                End If
            End If
            Stelle = (Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineBesetzungen))
            If Stelle >= 0 Then
                If Besiegbar(I, Stelle) = False Then
                    If AnzahlderGebäude(I) > 0 Then
                        Besiegbar(I, Stelle) = True
                    End If
                End If
            End If
            If IsNothing(Unbesiegbar) = False Then
                If Array.IndexOf(Unbesiegbar, I) Then
                    For I2 = 0 To StandartSiegbedingungen.Length - 1
                        Besiegbar(I, I2) = False
                    Next
                End If
            End If
        Next
        'Geschlossene Spieler verlieren!
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
                Besiegt(I) = True
            End If
        Next
    End Sub
    Private Function CountTeams() As Integer
        Dim Teams As Integer = 0
        Dim ErfassteTeams() As Char = {}
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) = False Then
                If Array.IndexOf(ErfassteTeams, Objektverwalter.Spielfeld.Spieler(I).Team) < 0 Then
                    Teams += 1
                    Array.Resize(ErfassteTeams, ErfassteTeams.Length + 1)
                    ErfassteTeams(ErfassteTeams.Length - 1) = Objektverwalter.Spielfeld.Spieler(I).Team
                End If
            End If
        Next
        Return Teams
    End Function
    Public Sub SiegBedingungHinzufügen(ByVal Siegbedingung As Siegbedingungen, ByVal Spieler As Integer, Optional ByVal TageBes As Integer = -1)
        For I = 0 To StandartSiegbedingungen.Length - 1
            If StandartSiegbedingungen(I) = Siegbedingung Then
                Exit Sub
            End If
        Next

        Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
        StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingung

        ReDim Besiegbar(Spieler, StandartSiegbedingungen.Length - 1)
        Select Case Siegbedingung
            Case Siegbedingungen.KeineBesetzungen

            Case Siegbedingungen.KeineEinheiten

            Case Siegbedingungen.KeineHQs

            Case Siegbedingungen.Besetzungen
                AnzahlderBesetzungen = TageBes
            Case Siegbedingungen.Zeit
                MaximaleSpieldauer = TageBes
        End Select
    End Sub
    Public Sub AddUnbesiegbar(ByVal Spieler As Integer)
        If Unbesiegbar Is Nothing Then
            Array.Resize(Unbesiegbar, 1)
        Else
            Array.Resize(Unbesiegbar, Unbesiegbar.Length + 1)
        End If
        Unbesiegbar(Unbesiegbar.Length - 1) = Spieler
    End Sub
    Private Sub NeutralMachen()
        Dim B As Integer() = {}
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) Then
                Array.Resize(B, B.Length + 1)
                B(B.Length - 1) = I
            End If
        Next
        Dim Schlacht As Integer = 0
        If Luftschlacht Then Schlacht += 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Besetzung > 0 Then
                            If B.Contains(G.Spieler) Then
                                G.Spieler = 0
                                G.getBildID(Objektverwalter.Spielfeld)
                            End If
                        End If
                    End If
                    If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If E IsNot Nothing Then
                            If B.Contains(E.Spieler) Then
                                Objektverwalter.NeuObjektAnimation(X, Y, I)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Übernimmt alle feindliche Einheiten.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Übernehmen(ByVal Spieler As Integer)
        Dim Schlacht As Integer = 0
        If Luftschlacht Then Schlacht += 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Besetzung > 0 Then
                            If G.Spieler = Spieler Then
                                G.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                                G.getBildID(Objektverwalter.Spielfeld)
                            End If
                        End If
                    End If
                    If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If E IsNot Nothing Then
                            If E.Spieler = Spieler Then
                                Objektverwalter.NeuObjektAnimation(X, Y, I)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
#End Region
    ''' <summary>
    ''' Klont die kompletten Regeln.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim R As ObjektRegeln = MemberwiseClone()
        ReDim R.Wetterwahrscheinlichkeiten(Wetterwahrscheinlichkeiten.Length - 1)
        For I = 0 To Wetterwahrscheinlichkeiten.Length - 1
            R.Wetterwahrscheinlichkeiten(I) = Wetterwahrscheinlichkeiten(I)
        Next
        If Missionsgewinner IsNot Nothing Then
            ReDim R.Missionsgewinner(Missionsgewinner.Length - 1)
            For I = 0 To Missionsgewinner.Length - 1
                R.Missionsgewinner(I) = Missionsgewinner(I)
            Next
        End If
        If Unbesiegbar IsNot Nothing Then
            ReDim R.Unbesiegbar(Unbesiegbar.Length - 1)
            For I = 0 To Unbesiegbar.Length - 1
                R.Unbesiegbar(I) = Unbesiegbar(I)
            Next
        End If
        ReDim R.Besiegt(Besiegt.Length - 1)
        For I = 0 To Besiegt.Length - 1
            R.Besiegt(I) = Besiegt(I)
        Next
        ReDim R.StandartSiegbedingungen(StandartSiegbedingungen.Length - 1)
        For I = 0 To StandartSiegbedingungen.Length - 1
            R.StandartSiegbedingungen(I) = StandartSiegbedingungen(I)
        Next
        If Missionssiege IsNot Nothing Then
            ReDim R.Missionssiege(Missionssiege.Length - 1)
            For I = 0 To Missionssiege.Length - 1
                R.Missionssiege(I) = Missionssiege(I)
            Next
        End If
        ReDim R.Besiegbar(Besiegbar.GetLength(0) - 1, Besiegbar.GetLength(1) - 1)
        For I = 0 To Besiegbar.GetLength(0) - 1
            For I2 = 0 To Besiegbar.GetLength(1) - 1
                R.Besiegbar(I, I2) = Besiegbar(I, I2)
            Next
        Next
        Return R
    End Function

#Region "Regeln Senden"
    Public Function GetStandartSiegbedingungen() As String
        Dim S As String = ""
        For i = 0 To StandartSiegbedingungen.Length - 1
            If i = StandartSiegbedingungen.Length - 1 Then
                S += CInt(StandartSiegbedingungen(i)).ToString
            Else
                S += CInt(StandartSiegbedingungen(i)).ToString + "_"
            End If
        Next
        Return S
    End Function
    Public Function GetWetterwahrscheinlichkeiten() As String
        Dim S As String = ""
        For i = 0 To Wetterwahrscheinlichkeiten.Length - 1
            If i = Wetterwahrscheinlichkeiten.Length - 1 Then
                S += CInt(Wetterwahrscheinlichkeiten(i)).ToString
            Else
                S += CInt(Wetterwahrscheinlichkeiten(i)).ToString + "_"
            End If
        Next
        Return S
    End Function
#End Region
#Region "Rang Informationen"
    Public MaxTime As Integer = -1
    Public MaxDeployedUnits As Int64 = -1
#End Region
End Class
